<?php

// class Code
// {
// 	// 验证码数量
// 	protected $number;
// 	// 验证码类型
// 	protected $codeType;
// 	// 图片长度
// 	protected $height;
// 	// 图片宽度
// 	protected $width;
// 	// 验证码
// 	protected $code;
// 	// 验证码资源
// 	protected $image;

// 	// 初始化类成员变量
// 	public function __construct($number = 4, $codeType = 2, $height = 50, $width = 100)
// 	{
// 		$this->number = $number;
// 		$this->codeType = $codeType;
// 		$this->height = $height;
// 		$this->width = $width;

// 		$this->code = $this->createCode();

// 	}

// 	public function __destruct()
// 	{

// 		$this->image && imagedestroy($this->image);
// 	}

// 	public function __get($name)
// 	{
// 		if($name == 'code'){
// 			return $this->code;
// 		}
// 		return false;
// 	}

// 	// 生成验证码
// 	protected function createCode()
// 	{
// 		$code = null;

// 		switch ($this->codeType) {
// 			case 0:	//纯数字验证码
// 				$code = $this->getNumberCode();
// 				break;
// 			case 1:	//纯字母验证码
// 				$code = $this->getCharCode();
// 				break;
// 			case 2:	//数字和字母混合验证码
// 				$code = $this->getNumCharCode();
// 				break;
			
// 			default:
// 				die('不支持此种类型验证码！');
// 				break;
// 		}

// 		return $code;
// 	}

// 	// 生成纯数字验证码
// 	protected function getNumberCode()
// 	{
// 		return substr(str_shuffle(join("", range(0, 9))), 0, $this->number);
// 	}

// 	// 生成纯字母验证码
// 	protected function getCharCode()
// 	{
// 		return substr(str_shuffle(join("", range("a", "z")).strtoupper(join("", range("a", "z")))), 0, $this->number);
// 	}

// 	// 生成数字和字母混合验证码
// 	protected function getNumCharCode()
// 	{
// 		return substr(str_shuffle(join("", range(0, 9)).join("", range("a", "z")).strtoupper(join("", range("a", "z")))), 0, $this->number);
// 	}

// 	// 创建画布画布
// 	protected function createImage()
// 	{
// 		$this->image = imagecreatetruecolor($this->width, $this->height);
// 	}

// 	// 填充背景色
// 	protected function fillBack()
// 	{
// 		imagefill($this->image, 0, 0, $this->lightColor());
// 	}

// 	// 生成浅色
// 	protected function lightColor()
// 	{
// 		return imagecolorallocate($this->image, mt_rand(130, 250), mt_rand(130, 250), mt_rand(130, 250));
// 	}

// 	// 生成深色
// 	protected function darkColor()
// 	{
// 		return imagecolorallocate($this->image, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
// 	}

// 	// 画上字符串
// 	protected function drawChar()
// 	{
// 		$width = ceil($this->width / $this->number);
		
// 		for($i = 0; $i < $this->number; $i++){
// 			$x = mt_rand($i * $width - 5, ($i + 1) * $width - 15);
// 			$y = mt_rand(10, $this->height - 20);

// 			imagechar($this->image, 5, $x, $y, $this->code[$i], $this->darkColor());
// 		}

// 	}

// 	// 添加干扰元素
// 	protected function setPixel()
// 	{
// 		for($i = 0; $i < 150; $i++) {

// 			$x = mt_rand(0, $this->width);
// 			$y = mt_rand(0, $this->height);

// 			imagesetpixel($this->image, $x, $y, $this->lightColor());
// 		}
// 	}

// 	// 输出显示
// 	protected function show()
// 	{
// 		header("Content-Type: image/png");
// 		imagepng($this->image);
// 	}

// 	// 生成验证码图片
// 	public function outImage()
// 	{
// 		// 生成画布
// 		$this->createImage();
// 		// 添加背景颜色
// 		$this->fillBack();
// 		// 在图片上画上验证码
// 		$this->drawChar();
// 		// 添加干扰元素
// 		$this->setPixel();
// 		// 输出显示
// 		$this->show();
// 	}
// }
$code = new Code();
$code->outImage();

class Code{
	protected $number; //验证码数量
	protected $codeType; //验证码类型1数字2字母3混合
	protected $codeWidth; //图片宽度
	protected $codeHeight; //图片高度
	protected $img; //图片资源
	protected $code; //验证码

	public function __construct($codeType=3, $number = 4, $codeHeight=200, $codeWidth=400)
	{
		$this->number = $number;
		$this->codeType = $codeType;
		$this->codeWidth = $codeWidth;
		$this->codeHeight = $codeHeight;

		$this->getCode();
	}

	public function __destruct()
	{
		imagedestroy($this->img);
	}

	// 获取验证码
	protected function getCode()
	{
		switch ($this->codeType) {
			case 1:
			$this->getNumberCode();
				break;
			case 2:
			$this->getCharCode();
				break;
			case 3:
			$this->getNumCharCode();
				break;
			default:
				die("没有这个类型验证码");
				break;
		}
	}

	// 生成纯数字验证码
	protected function getNumberCode()
	{
		$this->code = substr(str_shuffle(join(range(0, 9), "")), 0, $this->number);
	}

	// 生成纯字母验证码
	protected function getCharCode()
	{
		$this->code = substr(str_shuffle(join(range("a", "z"), "").join(range("A", "Z"), "")), 0, $this->number);
	}

	// 生成数字字母混合验证码
	protected function getNumCharCode()
	{
		$this->code = substr(str_shuffle(join(range("a", "z"), "").join(range("A", "Z"), "").join(range(0, 9), "")), 0, $this->number);
	}

	protected function createImage()
	{
		$this->img = imagecreatetruecolor($this->codeWidth, $this->codeHeight);
	}

	// 生成深色
	protected function darkColor()
	{
		return imagecolorallocate($this->img, mt_rand(120, 255), mt_rand(120, 255), mt_rand(120, 255));
	}

	// 生成浅色
	protected function lightColor()
	{
		return imagecolorallocate($this->img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
	}

	protected function fillBack()
	{
		imagefill($this->img, 0, 0, $this->lightColor());
	}

	protected function drawChar()
	{

		$width = ceil($this->codeWidth / $this->number);
		for ($i=0; $i < $this->number; $i++) { 
			$x = mt_rand($width * $i + 20, ($i+1) * $width -20);
			$y = mt_rand(20, $this->codeHeight - 20);
			imagechar($this->img, 5, $x, $y, $this->code[$i], $this->darkColor());
		}

		
	}

	protected function drawDisturb()
	{
		for ($i=0; $i < 200; $i++) { 

			imagesetpixel($this->img, mt_rand(0, $this->codeWidth), mt_rand(0, $this->codeHeight), $this->darkColor());
			
		}
	}

	protected function show()
	{
		header("Content-Type:image/png");
		imagepng($this->img);
	}
	// 生成验证码图片
	public function outImage()
	{
		// 创建画布
		$this->createImage();
		// 添加背景颜色
		$this->fillBack();
		// 画数字
		$this->drawChar();
		// 添加干扰元素
		$this->drawDisturb();
		// 输出显示
		$this->show();
	}
}